#pragma once

#include <boost/asio.hpp>
#include <memory>
#include <string>
#include <queue>
#include <vector>

using boost::asio::ip::tcp;

class IMessageReceiver;

/**
 * @brief TCP会话类
 * 
 * 管理单个客户端连接，处理数据的读取和发送
 * 使用异步操作处理I/O
 */
class TcpSession : public std::enable_shared_from_this<TcpSession> {
public:
    /**
     * @brief 构造函数
     * @param socket 已建立的TCP套接字
     */
    explicit TcpSession(tcp::socket socket, IMessageReceiver& message_receiver);

    /**
     * @brief 设置会话ID
     * @param session_id 会话ID
     */
    void set_session_id(uint32_t session_id) { session_id_ = session_id; }

    /**
     * @brief 获取会话ID
     * @return 会话ID
     */
    uint32_t get_session_id() const { return session_id_; }

    /**
     * @brief 启动会话
     * 开始异步读取数据
     */
    void start();

    /**
     * @brief 停止会话
     * 关闭套接字连接
     */
    void stop();

    /**
     * @brief 发送消息
     * @param data 要发送的数据
     */
    void send(const std::vector<uint8_t>& data);

private:
    /**
     * @brief 异步读取数据
     * 从套接字读取数据直到遇到换行符
     */
    void do_read();

    /**
     * @brief 异步写入数据
     * 将消息队列中的数据写入套接字
     */
    void do_write();

    /**
     * @brief 处理连接断开
     */
    void handle_disconnect();

    tcp::socket socket_;              ///< TCP套接字
    boost::asio::streambuf read_buffer_;     ///< 读取缓冲区
    std::queue<std::vector<uint8_t>> write_queue_; ///< 待发送消息队列
    uint32_t session_id_{0}; ///< 会话ID
    IMessageReceiver& message_receiver_; ///< 消息接收器
};